/**
 * ControladoraBDComite.java
 */

/**
 *  AdSec: Administrador de Secundarias
 *  Copyright (C) 2009 Daniela Ramírez Chaves (dannyrch@gmail.com)
 *  Copyright (C) 2009 Leonel Salazar Valverde (leo87sv@gmail.com)
 *
 *  This file is part of AdSec.
 *  AdSec is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  AdSec is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with AdSec.  If not, see <http://www.gnu.org/licenses/>.
 */

package adsec.datos;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.ResultSet;
import java.util.Iterator;
import java.util.LinkedList;
import adsec.entidades.Comite;
import adsec.entidades.Docente;


public class ControladoraBDComite {

    private Connection conexion;
    private AdministradorConexion adminConexion;
    
    public ControladoraBDComite(){
        adminConexion = AdministradorConexion.getInstancia();
    }

    public Comite consultarComite(int idComite){
        Comite comite = null;
        conexion = adminConexion.getConexion();
        if(conexion != null){
            CallableStatement procedimiento = this.spConsultarComite(conexion, idComite);
            if(procedimiento != null){
                try{
                    procedimiento.execute();
                    ResultSet resultado = procedimiento.getResultSet();
                    if(resultado.next()){
                        comite = this.crearComite(resultado);
                    }
                }catch(SQLException e){
                    e.printStackTrace();
                }//fin de try catch
            }//fin de if
        }//fin de if
        adminConexion.cerrarConexion();
        return comite;
    }//fin de consultarComite

    public LinkedList<Comite> consultarComites(){
        LinkedList<Comite> lista = new LinkedList<Comite>();
        conexion = adminConexion.getConexion();
        if(conexion != null){
            CallableStatement procedimiento = this.spConsultarComites(conexion);
            if(procedimiento != null){
                try{
                    procedimiento.execute();
                    ResultSet resultado = procedimiento.getResultSet();
                    while(resultado.next()){
                        Comite comite = this.crearComite(resultado);
                        lista.add(comite);
                    }//fin de while
                }catch(SQLException e){
                    e.printStackTrace();
                }//fin de try catch
            }//fin de if
        }//fin de if
        adminConexion.cerrarConexion();
        return lista;
    }//fin de consultarComites

    public LinkedList<Comite> consultarComitesDocente(String cedDocente){
        LinkedList<Comite> lista = new LinkedList<Comite>();
        conexion = adminConexion.getConexion();
        if(conexion != null){
            CallableStatement procedimiento = this.spConsultarComitesDocente(conexion, cedDocente);
            if(procedimiento != null){
                try{
                    procedimiento.execute();
                    ResultSet resultado = procedimiento.getResultSet();
                    while(resultado.next()){
                        Comite comite = this.crearComiteDocente(resultado);
                        lista.add(comite);
                    }//fin de while
                }catch(SQLException e){
                    e.printStackTrace();
                }//fin de try catch
            }//fin de if
        }//fin de if
        adminConexion.cerrarConexion();
        return lista;
    }//fin de consultarComites

    public int insertarComite(Comite comite, LinkedList<Docente> docentes){
        int resultado = AdministradorConexion.QUERY_ERROR;
        conexion = adminConexion.getConexion();
        if(conexion != null){
            CallableStatement procedimiento = this.spInsertarComite(conexion, comite);
            int idComite = -1;
            if(procedimiento != null){
                try{
                    procedimiento.execute();
                    ResultSet resultado_idComite = procedimiento.executeQuery("SELECT LAST_INSERT_ID()");
                    resultado = AdministradorConexion.QUERY_OK;
                    if(resultado_idComite.next()){
                        idComite = resultado_idComite.getInt(1);
                    }
                    if(idComite != -1 && !docentes.isEmpty()){
                        resultado = this.insertarDocenteComite(conexion, idComite, docentes);
                    }
                }catch(SQLException e){
                    e.printStackTrace();
                }//fin de try catch
            }//fin de if      
        }//fin de if
        adminConexion.cerrarConexion();
        return resultado;
    }//fin de insertarComite

    public int insertarDocenteComite(Connection conexion,int idComite, LinkedList<Docente> docentes){
        int resultado = AdministradorConexion.QUERY_ERROR;
        Iterator<Docente> iterador = docentes.iterator();
        while(iterador.hasNext()){
            CallableStatement procedimiento = this.spInsertarDocenteComite(conexion, idComite, iterador.next().getCedula());
            if(procedimiento != null){
                try{
                    procedimiento.execute();
                    resultado = AdministradorConexion.QUERY_OK;
                }catch(SQLException e){
                    e.printStackTrace();
                }
            }
        }
        return resultado;
    }

    public int insertarDocenteComite(String cedDocente, LinkedList<Comite> comites){
        int resultado = AdministradorConexion.QUERY_ERROR;
        conexion = adminConexion.getConexion();
        Iterator<Comite> iterador = comites.iterator();
        while(iterador.hasNext()){
            CallableStatement procedimiento = this.spInsertarDocenteComite(conexion,iterador.next().getIdComite(), cedDocente);
            if(procedimiento != null){
                try{
                    procedimiento.execute();
                    resultado = AdministradorConexion.QUERY_OK;
                }catch(SQLException e){
                    e.printStackTrace();
                }
            }
        }
        adminConexion.cerrarConexion();
        return resultado;
    }

    public int modificarComite(Comite comite, LinkedList<Docente> docentes){
        int resultado = AdministradorConexion.QUERY_ERROR;
        conexion = adminConexion.getConexion();
        if(conexion != null){
            CallableStatement procedimiento = this.spModificarComite(conexion, comite);
            if(procedimiento != null){
                try{
                    procedimiento.execute();
                    resultado = AdministradorConexion.QUERY_OK;
                    resultado = this.eliminarTodosDocentesEnComite(comite.getIdComite(), conexion);
                    if(!docentes.isEmpty() && resultado == AdministradorConexion.QUERY_OK){
                        resultado = this.insertarDocenteComite(conexion, comite.getIdComite(), docentes);
                    }
                }catch(SQLException e){
                    e.printStackTrace();
                }//fin de try catch
            }//fin de if
        }//fin de if
        adminConexion.cerrarConexion();
        return resultado;
    }//fin de modificarComite

    public int eliminarTodosDocentesEnComite(int idComite, Connection conexion){
        int resultado = AdministradorConexion.QUERY_ERROR;
        if(conexion != null){
            CallableStatement procedimiento = this.spEliminarTodosDocentesEnComite(conexion, idComite);
            if(procedimiento != null){
                try{
                    procedimiento.execute();
                    resultado = AdministradorConexion.QUERY_OK;
                }catch(SQLException e){
                    e.printStackTrace();
                }//fin de try catch
            }//fin de if
        }//fin de if
        return resultado;
    }//fin de eliminarComite

    public int eliminarTodosComitesDelDocente(String cedulaDocente){
        int resultado = AdministradorConexion.QUERY_ERROR;
        conexion = adminConexion.getConexion();
        if(conexion != null){
            CallableStatement procedimiento = this.spEliminarTodosComitesDelDocente(conexion, cedulaDocente);
            if(procedimiento != null){
                try{
                    procedimiento.execute();
                    resultado = AdministradorConexion.QUERY_OK;
                }catch(SQLException e){
                    e.printStackTrace();
                }//fin de try catch
            }//fin de if
        }//fin de if
        adminConexion.cerrarConexion();
        return resultado;
    }//fin de eliminarComite

    public int eliminarComite(int idComite){
        int resultado = AdministradorConexion.QUERY_ERROR;
        conexion = adminConexion.getConexion();
        if(conexion != null){
            CallableStatement procedimiento = this.spEliminarComite(conexion, idComite);
            if(procedimiento != null){
                try{
                    procedimiento.execute();
                    resultado = AdministradorConexion.QUERY_OK;
                }catch(SQLException e){
                    e.printStackTrace();
                }//fin de try catch
            }//fin de if
        }//fin de if
        adminConexion.cerrarConexion();
        return resultado;
    }//fin de eliminarComite

    private CallableStatement spConsultarComite(Connection conexion, int idComite){
        CallableStatement procedimiento = null;
        try{
            procedimiento = conexion.prepareCall("CALL consultarComite" + UtilidadesCapaDatos.agregarParametros(1),
                ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
            procedimiento.setInt(Comite.idComiteNC + "_p", idComite);
        }catch(SQLException sqlException){
            sqlException.printStackTrace();
        }
        return procedimiento;
    }//fin de spConsultarComite
    
    private CallableStatement spConsultarComites(Connection conexion){
        CallableStatement procedimiento = null;
        try{
            procedimiento = conexion.prepareCall("CALL consultarComites()",
                ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
        }catch(SQLException sqlException){
            sqlException.printStackTrace();
        }
        return procedimiento;
    }//fin de spConsultarComite

   private CallableStatement spConsultarComitesDocente(Connection conexion, String cedDocente){
        CallableStatement procedimiento = null;
        try{
            procedimiento = conexion.prepareCall("CALL consultarComitesDocente" + UtilidadesCapaDatos.agregarParametros(1),
                ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
            procedimiento.setString(Comite.cedDocenteNC + "_p", cedDocente);
        }catch(SQLException sqlException){
            sqlException.printStackTrace();
        }
        return procedimiento;
    }//fin de spConsultarComite
    
    private CallableStatement spInsertarComite(Connection conexion, Comite comite){
        CallableStatement procedimiento = null;
        try{
            procedimiento = conexion.prepareCall("CALL insertarComite" + UtilidadesCapaDatos.agregarParametros(2),
                ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
            procedimiento.setString(Comite.nombreNC + "_p", comite.getNombre());
            procedimiento.setString(Comite.descripcionNC + "_p", comite.getDescripcion());
        }catch(SQLException sqlException){
            sqlException.printStackTrace();
        }
        return procedimiento;
    }//fin de spInsertarComite

    private CallableStatement spInsertarDocenteComite(Connection conexion, int idComite, String ced_docente){
        CallableStatement procedimiento = null;
        try{
            procedimiento = conexion.prepareCall("CALL insertarDocenteComite" + UtilidadesCapaDatos.agregarParametros(2),
                ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
            procedimiento.setString(Comite.cedDocenteNC + "_p", ced_docente);
            procedimiento.setInt(Comite.idComiteNC + "_p", idComite);
        }catch(SQLException sqlException){
            sqlException.printStackTrace();
        }
        return procedimiento;
    }

    private CallableStatement spModificarComite(Connection conexion, Comite comite){
        CallableStatement procedimiento = null;
        try{
            procedimiento = conexion.prepareCall("CALL modificarComite" + UtilidadesCapaDatos.agregarParametros(3),
                ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
            procedimiento.setInt(Comite.idComiteNC + "_p", comite.getIdComite());
            procedimiento.setString(Comite.nombreNC + "_p", comite.getNombre());
            procedimiento.setString(Comite.descripcionNC + "_p", comite.getDescripcion());
        }catch(SQLException sqlException){
            sqlException.printStackTrace();
        }
        return procedimiento;
    }//fin de spModificarComite
    
    private CallableStatement spEliminarComite(Connection conexion, int idComite){
        CallableStatement procedimiento = null;
        try{
            procedimiento = conexion.prepareCall("CALL eliminarComite" + UtilidadesCapaDatos.agregarParametros(1),
                ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
            procedimiento.setInt(Comite.idComiteNC + "_p", idComite);
        }catch(SQLException sqlException){
            sqlException.printStackTrace();
        }
        return procedimiento;
    }//fin de spEliminarComite

    private CallableStatement spEliminarTodosDocentesEnComite(Connection conexion, int idComite){
        CallableStatement procedimiento = null;
        try{
            procedimiento = conexion.prepareCall("CALL eliminarTodosDocentesEnComite" + UtilidadesCapaDatos.agregarParametros(1),
                ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
            procedimiento.setInt(Comite.idComiteNC + "_p", idComite);
        }catch(SQLException sqlException){
            sqlException.printStackTrace();
        }
        return procedimiento;
    }//fin de spEliminarComite

    private CallableStatement spEliminarTodosComitesDelDocente(Connection conexion, String cedulaDocente){
        CallableStatement procedimiento = null;
        try{
            procedimiento = conexion.prepareCall("CALL eliminarTodosComitesDelDocente" + UtilidadesCapaDatos.agregarParametros(1),
                ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
            procedimiento.setString(Comite.cedDocenteNC + "_p", cedulaDocente);
        }catch(SQLException sqlException){
            sqlException.printStackTrace();
        }
        return procedimiento;
    }//fin de spEliminarComite

    private Comite crearComite(ResultSet resultSet) throws SQLException{
        Comite comite = new Comite();
        comite.setIdComite(resultSet.getInt(Comite.idComiteNC));
        comite.setNombre(resultSet.getString(Comite.nombreNC));
        comite.setDescripcion(resultSet.getString(Comite.descripcionNC));
        return comite;
    }//fin de crearComite

    private Comite crearComiteDocente(ResultSet resultSet) throws SQLException{
        Comite comite = new Comite();
        comite.setIdComite(resultSet.getInt(Comite.idComiteNC));
        comite.setNombre(resultSet.getString(Comite.nombreNC));
        comite.setEstado(resultSet.getBoolean(Comite.estadoNC));
        return comite;
    }//fin de crearComite

}//fin de la clase ControladoraBDComite
